package comandos;

import java.util.ArrayList;

import model.ModeloAmigosEnComun;
import model.Usuario;
import protocol.MensajeComando;
import server.ClienteHilo;
import server.services.AmigosService;

public class AmigosEnComun implements ComandoServidor
{
	private MensajeComando estadoOperacion;
	private ArrayList<Usuario> amigosEnComun;
	private Usuario usuarioUno;
	private Usuario usuarioDos;
	private final Object lock = new Object();

	
	public void ejecutar (ClienteHilo cliente)
	{

		try
		{
			/**
			 * CODIGO DE LA BASE DE DATOS PARA OBTENER LOS AMIGOS DE UN USUARIO
			 */
			AmigosService servicioAmigos = new AmigosService();
			
			//Recibo el combo de usuarios de los cuales se quiere ver
			//los amigos en comun entre ellos.
			ModeloAmigosEnComun ambos = (ModeloAmigosEnComun) cliente.getInput().readObject();	

			//Escribo Logs..
			System.out.println("Amigos - Obteniendo amigos en comun entre " +
							   "<" + ambos.getUsuario().getNick() + "> y <" +
							   "<" + ambos.getOtroUsuario().getNick() + ">");
			
			//Traigo el listad de amigos en comun
			ArrayList<Usuario> amigosEnComun = (ArrayList<Usuario>) servicioAmigos.amigosEnComun(ambos.getUsuario(),ambos.getOtroUsuario());
			
			//Le envio al cliente un mensaje indicando que se va enviar la lista de amigos
			cliente.getOutput().writeObject(new MensajeComando("amigos_en_comun",0));
			cliente.getOutput().flush();
			
			//Le envio la lista de amigos
			cliente.getOutput().writeObject(amigosEnComun);
			cliente.getOutput().flush();
		}
		catch (Exception e)
		{
			e.printStackTrace();
			System.out.println("Problema al ejecutar el comando");
		}		
	}

	

	public ArrayList<Usuario> getAmigosEnComun() throws InterruptedException {
		synchronized (lock) {
			lock.wait();
			return amigosEnComun;
		}
	}



	public void setAmigosEnComun(ArrayList<Usuario> amigosEnComun) {
		this.amigosEnComun = amigosEnComun;
	}



	public MensajeComando getEstadoOperacion() {
		return estadoOperacion;
	}

	public void setEstadoOperacion(MensajeComando estadoOperacion) {
		this.estadoOperacion = estadoOperacion;
	}



	public Usuario getUsuarioUno() {
		return usuarioUno;
	}



	public void setUsuarioUno(Usuario usuarioUno) {
		this.usuarioUno = usuarioUno;
	}



	public Usuario getUsuarioDos() {
		return usuarioDos;
	}



	public void setUsuarioDos(Usuario usuarioDos) {
		this.usuarioDos = usuarioDos;
	}

}
